[PR]

水無瀬の部屋 > Programming > sample > tools > code > hashdll.cpp
最終更新日: 2007/04/02

   1: //*********************************************************
   2: // プロジェクト: 
   3: //   ファイル名: hashdll.cpp
   4: //*********************************************************
   5: #include <misc/ccslock.h>
   6: 
   7: 
   8: //---------------------------------------------------------
   9: // 公開関数 の 宣言
  10: //---------------------------------------------------------
  11: #ifdef __cplusplus
  12: extern "C" {
  13: #endif
  14: 
  15: 
  16: HANDLE WINAPI CreateAlgorithm( void );
  17: DWORD  WINAPI InitAlgorithm( HANDLE hAlgorithm );
  18: DWORD  WINAPI DestroyAlgorithm( HANDLE hAlgorithm );
  19: DWORD  WINAPI AddData( HANDLE hAlgorithm, const void *data, int length );
  20: int    WINAPI GetHashLength( HANDLE hAlgorithm );
  21: DWORD  WINAPI GetHash( HANDLE hAlgorithm, void *buffer, int bufsize );
  22: int    WINAPI GetHashTextLength( HANDLE hAlgorithm );
  23: DWORD  WINAPI GetHashText( HANDLE hAlgorithm, void *buffer, int bufsize );
  24: 
  25: 
  26: #ifdef __cplusplus
  27: } // extern "C"
  28: #endif
  29: 
  30: 
  31: //---------------------------------------------------------
  32: // マクロ の 定義
  33: //---------------------------------------------------------
  34: //
  35: #define MAGIC_STRING_LENGTH  ( sizeof( MAGIC_STRING ) )
  36: 
  37: //
  38: #define REPLACE_HASH_NAME( macro )                    macro
  39: #define MAKE_HASH_MACRO( suffix )                     REPLACE_HASH_NAME( ALGORITHM_PREFIX ) ## suffix
  40: #define HASH_CTX                                      MAKE_HASH_MACRO( _CTX )
  41: #define HASH_HASHSIZE                                 MAKE_HASH_MACRO( _HASHSIZE )
  42: #define HASH_HASHTEXTSIZE                             MAKE_HASH_MACRO( _HASHTEXTSIZE )
  43: #define HASH_CREATEALGORITHM                          MAKE_HASH_MACRO( _CreateAlgorithm )
  44: #define HASH_DESTROYALGORITHM( context )              MAKE_HASH_MACRO( _DestroyAlgorithm( context ) )
  45: #define HASH_INITDATA( context )                      MAKE_HASH_MACRO( _InitData( context ) )
  46: #define HASH_ADDDATA( context, data, length )         MAKE_HASH_MACRO( _AddData( context, data, length ) )
  47: #define HASH_GETHASH( context, buffer, bufsize )      MAKE_HASH_MACRO( _GetHash( context, buffer, bufsize ) )
  48: #define HASH_GETHASHTEXT( context, buffer, bufsize )  MAKE_HASH_MACRO( _GetHashText( context, buffer, bufsize ) )
  49: 
  50: //
  51: #define DLL_NOERROR              ( 0x00000000 )  // 関数は正常に終了しました。 
  52: #define DLL_PARAMERROR           ( 0x00000001 )  // 指定された引数が不正です。 
  53: #define DLL_SYSTEMERROR          ( 0x00000100 )  // 関数内部でエラーが発生しました。 
  54: #define HASH_INVALIDHASHSIZE     ( 0 )
  55: #define HASH_INVALIDHASHTEXTSIZE ( 0 )
  56: 
  57: 
  58: //---------------------------------------------------------
  59: // 構造体 の 宣言
  60: //---------------------------------------------------------
  61: typedef struct DLL_CTX_tag
  62: {
  63: 	const char             *magic;
  64: 	      HASH_CTX         *context;
  65: 	      CRITICAL_SECTION  cs;
  66: } DLL_CTX;
  67: 
  68: 
  69: //---------------------------------------------------------
  70: // ファイルスコープ関数 の 宣言
  71: //---------------------------------------------------------
  72: static bool WINAPI IsValidAlgorithm( HANDLE hAlgorithm );
  73: 
  74: 
  75: //*********************************************************
  76: // CreateAlgorithm
  77: //*********************************************************
  78: HANDLE // アルゴリズムへのハンドル
  79: WINAPI
  80: CreateAlgorithm
  81: 	(
  82: 		void
  83: 	)
  84: {
  85: 	DLL_CTX *context = (DLL_CTX *)malloc( sizeof( *context ) );
  86: 	if ( context )
  87: 	{
  88: 		context->context = HASH_CREATEALGORITHM();
  89: 		if ( context->context )
  90: 		{
  91: 			InitializeCriticalSection( &context->cs );
  92: 			context->magic = MAGIC_STRING;
  93: 			if ( DLL_NOERROR == InitAlgorithm( context ) )
  94: 			{
  95: 				return context;
  96: 			}
  97: 			DeleteCriticalSection( &context->cs );
  98: 			HASH_DESTROYALGORITHM( context->context );
  99: 		}
 100: 		free( context );
 101: 	}
 102: 	return null;
 103: }//CreateAlgorithm
 104: 
 105: //*********************************************************
 106: // DestroyAlgorithm
 107: //*********************************************************
 108: DWORD // エラー番号
 109: WINAPI
 110: DestroyAlgorithm
 111: 	(
 112: 		HANDLE hAlgorithm // アルゴリズムへのハンドル
 113: 	)
 114: {
 115: 	// 引数の検査
 116: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 117: 	if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
 118: 
 119: 	HASH_DESTROYALGORITHM( context->context );
 120: 	DeleteCriticalSection( &context->cs );
 121: 	memset( context, 0xCC, sizeof( *context ) );
 122: 	free( context );
 123: 
 124: 	return DLL_NOERROR;
 125: }//DestroyAlgorithm
 126: 
 127: //*********************************************************
 128: // InitAlgorithm
 129: //*********************************************************
 130: DWORD // エラー番号
 131: WINAPI
 132: InitAlgorithm
 133: 	(
 134: 		HANDLE hAlgorithm // アルゴリズムへのハンドル
 135: 	)
 136: {
 137: 	// 引数の検査
 138: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 139: 	if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
 140: 
 141: 	//
 142: 	{
 143: 		CLockCriticalSection Lock( &context->cs );
 144: 		if ( !HASH_INITDATA( context->context ) )
 145: 		{
 146: 			return DLL_SYSTEMERROR;
 147: 		}
 148: 	}
 149: 
 150: 	return DLL_NOERROR;
 151: }//InitAlgorithm
 152: 
 153: //*********************************************************
 154: // InputData
 155: //*********************************************************
 156: DWORD // エラー番号
 157: WINAPI
 158: InputData
 159: 	(
 160: 		      HANDLE  hAlgorithm, // アルゴリズムへのハンドル
 161: 		const void   *data,       // 入力するデータ
 162: 		      int     length      // data の バイト数
 163: 	)
 164: {
 165: 	// 引数の検査
 166: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 167: 	if ( length <= 0 ) { return DLL_PARAMERROR; }
 168: 	if ( !data || IsBadReadPtr( data, length ) ) { return DLL_PARAMERROR; }
 169: 	if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
 170: 
 171: 	//
 172: 	{
 173: 		CLockCriticalSection Lock( &context->cs );
 174: 		if ( !HASH_ADDDATA( context->context, data, length ) )
 175: 		{
 176: 			return DLL_SYSTEMERROR;
 177: 		}
 178: 	}
 179: 
 180: 	return DLL_NOERROR;
 181: }//InputData
 182: 
 183: //*********************************************************
 184: // GetHashLength
 185: //*********************************************************
 186: int // バイト数
 187: WINAPI
 188: GetHashLength
 189: 	(
 190: 		HANDLE hAlgorithm // アルゴリズムへのハンドル
 191: 	)
 192: {
 193: 	// 引数の検査
 194: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 195: 	if ( !IsValidAlgorithm( context ) ) { return HASH_INVALIDHASHSIZE; }
 196: 
 197: 	return HASH_HASHSIZE;
 198: }//GetHashLength
 199: 
 200: //*********************************************************
 201: // GetHash
 202: //*********************************************************
 203: DWORD // エラー番号
 204: WINAPI
 205: GetHash
 206: 	(
 207: 		HANDLE  hAlgorithm, // アルゴリズムへのハンドル
 208: 		void   *buffer,     // ハッシュを受け取るバッファ
 209: 		int     bufsize     // buffer の バイト数
 210: 	)
 211: {
 212: 	// 引数の検査
 213: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 214: 	if ( bufsize <= 0 ) { return DLL_PARAMERROR; }
 215: 	if ( !buffer || IsBadWritePtr( buffer, bufsize ) ) { return DLL_PARAMERROR; }
 216: 	if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
 217: 
 218: 	//
 219: 	{
 220: 		CLockCriticalSection Lock( &context->cs );
 221: 		if ( !HASH_GETHASH( context->context, buffer, bufsize ) )
 222: 		{
 223: 			return DLL_SYSTEMERROR;
 224: 		}
 225: 	}
 226: 
 227: 	return DLL_NOERROR;
 228: }//GetHash
 229: 
 230: //*********************************************************
 231: // GetHashTextLength
 232: //*********************************************************
 233: int // バイト数
 234: WINAPI
 235: GetHashTextLength
 236: 	(
 237: 		HANDLE hAlgorithm // アルゴリズムへのハンドル
 238: 	)
 239: {
 240: 	// 引数の検査
 241: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 242: 	if ( !IsValidAlgorithm( context ) ) { return HASH_INVALIDHASHTEXTSIZE; }
 243: 
 244: 	return HASH_HASHTEXTSIZE;
 245: }//GetHashTextLength
 246: 
 247: //*********************************************************
 248: // GetHashText
 249: //*********************************************************
 250: DWORD // エラー番号
 251: WINAPI
 252: GetHashText
 253: 	(
 254: 		HANDLE  hAlgorithm, // アルゴリズムへのハンドル
 255: 		char   *buffer,     // 文字列を受け取るバッファ
 256: 		int     bufsize     // buffer の バイト数
 257: 	)
 258: {
 259: 	// 引数の検査
 260: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 261: 	if ( bufsize <= 0 ) { return DLL_PARAMERROR; }
 262: 	if ( !buffer || IsBadWritePtr( buffer, bufsize ) ) { return DLL_PARAMERROR; }
 263: 	if ( !IsValidAlgorithm( context ) ) { return DLL_PARAMERROR; }
 264: 
 265: 	//
 266: 	{
 267: 		CLockCriticalSection Lock( &context->cs );
 268: 		if ( !HASH_GETHASHTEXT( context->context, buffer, bufsize ) )
 269: 		{
 270: 			return DLL_SYSTEMERROR;
 271: 		}
 272: 	}
 273: 
 274: 	return DLL_NOERROR;
 275: }//GetHashText
 276: 
 277: 
 278: //******************************************************************************************************************
 279: // private
 280: //******************************************************************************************************************
 281: //*********************************************************
 282: // IsValidAlgorithm
 283: //*********************************************************
 284: static
 285: bool
 286: WINAPI
 287: IsValidAlgorithm
 288: 	(
 289: 		HANDLE hAlgorithm // アルゴリズムへのハンドル
 290: 	)
 291: {
 292: 	DLL_CTX *context = static_cast<DLL_CTX *>( hAlgorithm );
 293: 
 294: 	VALID_TEST( context );
 295: 	VALID_TEST( ! IsBadReadPtr(  context, sizeof( *context ) ) );
 296: 	VALID_TEST( ! IsBadWritePtr( context, sizeof( *context ) ) );
 297: 	VALID_TEST( context->magic );
 298: 	VALID_TEST( ! IsBadStringPtr( context->magic, MAGIC_STRING_LENGTH ) );
 299: 	VALID_TEST( streql( context->magic, MAGIC_STRING ) );
 300: 	VALID_TEST( context->context );
 301: 
 302: 	return true;
 303: }//IsValidAlgorithm
 304: 
 305: 
 306: //** end **
 307: 

参照: main.cpp, main.cpp, main.cpp, main.cpp, main.cpp


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > tools > code > hashdll.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/code/hashdll_cpp.shtml
>> Amazon.co.jp 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ